package org.jsola.hr.dao;

import org.apache.ibatis.annotations.Param;
import org.jsola.hr.dto.EmpSocInfoAddDTO;
import org.jsola.hr.dto.EmpSocInfoUpdateDTO;
import org.jsola.hr.entity.EmpSocInfoDO;
import org.jsola.hr.entity.EmpSocItemDO;
import org.jsola.hr.query.EmpSocInfoQuery;
import org.jsola.hr.query.SocPlanDispatchUserQuery;
import org.jsola.hr.query.SocStatisticalQuery;
import org.jsola.hr.vo.EmpSocInfoListVO;
import org.jsola.hr.vo.EmpSocItemListVO;
import org.jsola.hr.vo.SocAmountVO;
import org.jsola.orm.mapper.IJsolaMapper;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;


/**
 * 员工参保信息表
 *
 * @author zhr
 */
@Repository("hrEmpSocInfoDAO")
public interface IEmpSocInfoDAO extends IJsolaMapper<EmpSocInfoDO> {

    /**
     * 查询员工参保月账单列表
     * @param empSocInfoQuery 查询条件
     * @param siteId 所属站点id
     * @return 员工参保月账单列表
     */
    List<EmpSocInfoListVO> getEmpSocInfoMonthList(@Param(value = "empSocInfoQuery") EmpSocInfoQuery empSocInfoQuery, @Param(value = "siteId") String siteId);

    /**
     * 查询员工参保金额统计
     * @param year 年
     * @param month 月
     * @param companyId 合同公司
     * @param siteId 所属站点ID
     * @return
     */
    EmpSocInfoListVO getAmount(@Param(value = "year") String year, @Param(value = "month") String month, @Param(value = "companyId") String companyId, @Param(value = "monthId") String monthId,
                               @Param(value = "siteId") String siteId, @Param(value = "year_previous") String year_previous, @Param(value = "month_previous") String month_previous);

    /**
     * 分页查询员工参保信息
     * @param empSocInfoQuery 参数
     * @param siteId 所属站点id
     * @param idList 主键id
     * @return
     */
    List<EmpSocInfoListVO> pageEmpSocInfoList(@Param(value = "empSocInfoQuery") EmpSocInfoQuery empSocInfoQuery, @Param(value = "siteId") String siteId,
                                              @Param(value = "idList") List<String> idList);

    /**
     * 社保总览
     * @param query 参数
     * @param siteId 所属站点id
     * @return
     */
    List<EmpSocInfoListVO> socOverviewList(@Param(value = "query") SocPlanDispatchUserQuery query,
                                           @Param(value = "siteId") String siteId);

    /**
     * 社保总览派单人员查询自己的数据
     * @param query 参数
     * @param siteId 所属站点id
     * @return
     */
    List<EmpSocInfoListVO> getNormalInfoByMonthEmpList(@Param(value = "query") SocPlanDispatchUserQuery query,
                                                       @Param(value = "siteId") String siteId);

    /**
     * 查询员工参保信息
     * @param empSocInfoQuery 查询参数
     * @param siteId 站点
     * @return 员工参保信息
     */
    List<EmpSocInfoListVO> empSocInfoCount(@Param(value = "empSocInfoQuery") EmpSocInfoQuery empSocInfoQuery,
                                           @Param(value = "siteId") String siteId);

    /**
     * 分页查询本月新增列表
     * @param empSocInfoQuery
     * @param siteId
     * @param orderBy
     * @param year_previous
     * @param month_previous
     * @return
     */
    List<EmpSocInfoListVO> pageAddEmpSocInfoList(@Param(value = "empSocInfoQuery") EmpSocInfoQuery empSocInfoQuery, @Param(value = "siteId") String siteId, @Param(value = "orderBy") String orderBy,
                                                 @Param(value = "year_previous") String year_previous, @Param(value = "month_previous") String month_previous);

    /**
     * 分页查询本月暂停投保列表
     * @param empSocInfoQuery
     * @param siteId
     * @param orderBy
     * @param year_previous
     * @param month_previous
     * @return
     */
    List<EmpSocInfoListVO> pageSuspendEmpSocInfoList(@Param(value = "empSocInfoQuery") EmpSocInfoQuery empSocInfoQuery, @Param(value = "siteId") String siteId, @Param(value = "orderBy") String orderBy,
                                                     @Param(value = "year_previous") String year_previous, @Param(value = "month_previous") String month_previous);

    /**
     * 修改参保id
     * @param infoList 员工参保信息主表的list
     * @param gmtModified 修改时间
     * @param modifiedUserId 修改人id
     * @return
     */
    Integer updateHrEmpSocInfo(@Param(value = "infoList")List<EmpSocInfoDO> infoList, @Param(value = "gmtModified")Date gmtModified,
                               @Param(value = "modifiedUserId")String modifiedUserId);

    /**
     * 修改基数
     * @param list 员工参保信息子表的list
     * @param gmtModified 修改时间
     * @param modifiedUserId 修改人id
     * @return
     */
    Integer updateHrEmpSocItem(@Param(value = "list")List<EmpSocItemListVO> list, @Param(value = "gmtModified")Date gmtModified,
                               @Param(value = "modifiedUserId")String modifiedUserId);

    /**
     * 修改公司或者个人的金额
     * @param list 员工参保信息子表的list
     * @param gmtModified 修改时间
     * @param modifiedUserId 修改人id
     * @return
     */
    Integer updateHrSocItemAmount(@Param(value = "list")List<EmpSocItemListVO> list, @Param(value = "gmtModified")Date gmtModified,
                                  @Param(value = "modifiedUserId")String modifiedUserId);

    /**
     * 查询相应时间所有的参保人员和撤销参保人员
     * @param monthId 月份
     * @param companyId 公司id
     * @param siteId 站点
     * @return
     */
    List<EmpSocInfoListVO> selectInfoByMonthId(@Param(value = "monthId") String monthId,
                                               @Param(value = "companyId") String companyId,
                                               @Param(value = "siteId") String siteId);

    /**
     * 查询相应时间所有的参保人员和撤销参保人员
     * @param monthId 月份
     * @param companyId 公司id
     * @param siteId 站点
     * @return
     */
    List<EmpSocInfoListVO> selectInfoByMonthId2(@Param(value = "monthId") String monthId,
                                               @Param(value = "companyId") String companyId,
                                               @Param(value = "siteId") String siteId);

    /**
     * 修改参保状态
     * @param year 年
     * @param month 月
     * @param companyId 公司id
     * @param empId 员工id
     * @param siteId 站点id
     * @param gmtModified 修改时间
     * @param modifiedUserId 修改人
     * @return
     */
    Boolean updateSocStatus(@Param(value = "year")String year, @Param(value = "month") String month,
                            @Param(value = "companyId") String companyId, @Param(value = "empId") String empId,
                            @Param(value = "siteId") String siteId, @Param(value = "gmtModified")Date gmtModified,
                            @Param(value = "modifiedUserId")String modifiedUserId);

    /**
     * 某个员工的参保记录
     * @param empSocInfoQuery
     * @param siteId
     * @return
     */
    List<EmpSocInfoListVO> selectEmpSocInfoByEmpId(@Param(value = "empSocInfoQuery")EmpSocInfoQuery empSocInfoQuery, @Param(value = "siteId") String siteId);

    /**
     * 查询某个员工参保记录所在的年份
     * @param empId 员工id
     * @param companyId 公司id
     * @param siteId 站点id
     * @return 返回年份集合
     */
    List<String> selectYearDistinctByEmpId(@Param(value = "empId")String empId, @Param(value = "companyId")String companyId,
                                           @Param(value = "siteId") String siteId);

    /**
     * 按照月份统计信息删除参保人员
     * @param list 月统计id集合
     * @param gmtModified 修改时间
     * @param modifiedUserId 修改人
     * @return
     */
    Integer updateEmpSocInfoByMonthId(@Param(value = "list")List<String> list, @Param(value = "gmtModified")Date gmtModified,
                                      @Param(value = "modifiedUserId")String modifiedUserId);

    /**
     * 编辑参保方案时修改员工参保信息
     * @param empSocInfoAddDTO 参保信息
     * @param list 条件集合
     * @param gmtModified 修改时间
     * @param modifiedUserId 修改人
     * @return
     */
    Integer updateSocInfoByProgId(@Param(value = "empSocInfoAddDTO")EmpSocInfoAddDTO empSocInfoAddDTO,
                                  @Param(value = "list")List<EmpSocInfoUpdateDTO> list, @Param(value = "gmtModified")Date gmtModified,
                                  @Param(value = "modifiedUserId")String modifiedUserId);

    /**
     * 编辑参保方案时修改员工参保信息子表
     * @param list 信息list
     * @param gmtModified 修改时间
     * @param modifiedUserId 修改人id
     * @return
     */
    Integer updateItemByEmpSocId(@Param(value = "list")List<EmpSocItemDO> list, @Param(value = "gmtModified")Date gmtModified,
                                 @Param(value = "modifiedUserId")String modifiedUserId);

    /**
     * 根据参保方案id查询参保人员
     * @param progId
     * @param siteId
     * @return
     */
    List<EmpSocInfoListVO> selectTimeInfoByProgId(@Param(value = "progId")String progId, @Param(value = "siteId")String siteId);

    /**
     * 根据参保人员去修改参保人员子项公积金状态
     * @param list 公积金内容
     * @param gmtModified 修改时间
     * @param modifiedUserId 修改人id
     * @param itemType 类型
     * @return
     */
    Integer updateItemByProgPayProvidentFund(@Param(value = "list")List<EmpSocInfoListVO> list,
                                             @Param(value = "gmtModified")Date gmtModified,
                                             @Param(value = "modifiedUserId")String modifiedUserId,
                                             @Param(value = "itemType")String itemType);

    /**
     * 根据条件查询参保记录表是否有符合条件的记录
     * @param year 年
     * @param month 月
     * @param companyId 公司id
     * @param idCard 身份证号码
     * @param siteId 站点id
     * @return 返回结果
     */
    List<String> selectEmpSocInfoByIdCard(@Param(value = "year")String year, @Param(value = "month")String month,
                                          @Param(value = "companyId")String companyId, @Param(value = "idCard")String idCard,
                                          @Param(value = "siteId")String siteId);

    /**
     * 查询某个月或者某个时间段的参保费用统计
     * @param socStatisticalQuery 查询参数
     * @param siteId 站点id
     * @return 返回结果
     */
    List<SocAmountVO> selectAmount(@Param(value = "socStatisticalQuery") SocStatisticalQuery socStatisticalQuery,
                                   @Param(value = "siteId") String siteId);


    /**
     * 查询某年参保费用统计
     * @param oneYearMonthIdList 一年的monthId
     * @param companyId 公司Id
     * @param siteId    站点id
     * @return 返回结果
     */
    SocAmountVO selectOneYearAmount(@Param(value = "list") List<String> oneYearMonthIdList,
                                    @Param(value = "companyId") String companyId,
                                    @Param(value = "siteId") String siteId);

    /**
     * 查询某个月或者某个时间段的员工参保信息
     * @param socStatisticalQuery 查询参数
     * @param siteId 站点id
     * @return 返回结果
     */
    List<EmpSocInfoListVO> selectEmpSocInfoStatistical(@Param(value = "socStatisticalQuery") SocStatisticalQuery socStatisticalQuery,
                                   @Param(value = "siteId") String siteId);


    /**
     * 查询某个时间段的各个月份的社保和公积金统计
     * @param socStatisticalQuery 查询参数
     * @param siteId 站点id
     * @return 返回结果
     */
    List<SocAmountVO> selectMonthStatistical(@Param(value = "socStatisticalQuery") SocStatisticalQuery socStatisticalQuery,
                                             @Param(value = "siteId") String siteId);

    /**
     * 查询某个时间段的各个用工单位的社保和公积金统计
     * @param socStatisticalQuery 查询参数
     * @param siteId 站点id
     * @return 返回结果
     */
    List<SocAmountVO> selectCompanyStatistical(@Param(value = "socStatisticalQuery") SocStatisticalQuery socStatisticalQuery,
                                             @Param(value = "siteId") String siteId);

    /**
     * 查询某个人的参保记录
     * @param empId 员工Id
     * @param companyId 公司Id
     * @param siteId 站点
     * @return 参保记录
     */
    List<EmpSocInfoDO> selectEmpSocInfoBrieflyByEmpId(@Param(value = "empId")String empId,
                                                      @Param(value = "companyId")String companyId,
                                                      @Param(value = "siteId")String siteId);

    /**
     * 甲方端小程序社保列表页
     *
     * @param empSocInfoQuery 查询条件
     * @param siteId          站点
     * @return 列表
     */
    List<EmpSocInfoListVO> jfEmpSocInfoList(@Param("empSocInfoQuery") EmpSocInfoQuery empSocInfoQuery,
                                            @Param("siteId") String siteId);
}

